package broad.dao;


import broad.bean.Objeto;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class DAOObjeto extends DAOGenerics<Objeto, Integer> {

    @Override
    public Objeto buscar(Integer obj) {
        SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
        Session s = sf.openSession();

        try {
            return buscar(obj, s);

        } finally {
            s.close();
        }
    }

    @Override
    public Objeto buscar(Integer obj, Session s) {
        String sql = "from Objeto where idObjeto = :id";

        Query qr = s.createQuery(sql);
        qr.setParameter("id", obj);

        return (Objeto) qr.uniqueResult();
    }

    @Override
    public List<Objeto> buscarTodos() {
        SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
        Session s = sf.openSession();

        try {
            return buscarTodos(s);

        } finally {
            s.close();
        }
    }

    @Override
    public List<Objeto> buscarTodos(Session s) {
        String sql = "from Objeto";

        Query qr = s.createQuery(sql);

        return (List<Objeto>) qr.list();
    }

    public List<Objeto> buscarArquivos(String titulo, String autor, String tag) {
        SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
        Session s = sf.openSession();

        try {
            return buscarArquivos(titulo, autor, tag, s);

        } finally {
            s.close();
        }
    }

    public List<Objeto> buscarArquivos(String titulo, String autor, String tag, Session s) {
        String sql = "from Objeto o where o.lomTitle like :titulo and o.autor like :autor and o.lomKeyword like :tag"
                + " and o.aberto = :aberto";

        Query qr = s.createQuery(sql);

        if (titulo.isEmpty()){
        qr.setParameter("titulo", "%");
        }else{qr.setParameter("titulo", titulo + "%");
        }
        if (autor.isEmpty()){
        qr.setParameter("autor", "%");
        }else{qr.setParameter("autor", autor + "%");
        }
        if (tag.isEmpty()){
        qr.setParameter("tag", "%");
        }else{qr.setParameter("tag", tag + "%");
        }

        qr.setParameter("aberto", 1);//permite download

        return (List<Objeto>) qr.list();
    }

    public List<Objeto> buscarArquivosEdicao(String titulo, String autor, String tag, String link) {
        SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
        Session s = sf.openSession();

        try {
            return buscarArquivosEdicao(titulo, autor, tag, link, s);

        } finally {
            s.close();
        }
    }    
    
    public List<Objeto> buscarArquivosEdicao(String titulo, String autor, String tag, String link, Session s) {
        String sql = "from Objeto o where " +
            // a função "coalesce" é usada para que "like %" também aceite o valor NULL:
            "coalesce(o.lomTitle,'') like :titulo and " +
            "coalesce(o.autor,'') like :autor and " +
            "coalesce(o.lomKeyword,'') like :tag and " +
            // extrair nome do arquivo do caminho, e comparar nome do arquivo com o parâmetro:
            "REVERSE(SUBSTRING(" +
            "   REVERSE(coalesce(o.link,''))," +
            "   1," +
            "   LOCATE(" +
            "      '/'," +
            "      REVERSE(coalesce(o.link,''))," +
            "      1" +
            "   )-1" +
            ")) like :link";

        Query qr = s.createQuery(sql);

        if (titulo.isEmpty()){
        qr.setParameter("titulo", "%");
        }else{qr.setParameter("titulo", titulo + "%");
        }
        if (autor.isEmpty()){
        qr.setParameter("autor", "%");
        }else{qr.setParameter("autor", autor + "%");
        }
        if (tag.isEmpty()){
        qr.setParameter("tag", "%");
        }else{qr.setParameter("tag", tag + "%");
        }
        if (link.isEmpty()){
        qr.setParameter("link", "%");
        }else{qr.setParameter("link", link + "%");
        }
        
        return (List<Objeto>) qr.list();
    }

    public List<Objeto> buscarArquivos(Integer idCategoria) {
        SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
        Session s = sf.openSession();

        try {
            return buscarArquivos(idCategoria, s);

        } finally {
            s.close();
        }
    }    
    
    public List<Objeto> buscarArquivos(Integer idCategoria, Session s) {
        String sql = "from Objeto o where o.categoria.idcategoria = :idcategoria";

        Query qr = s.createQuery(sql);
        qr.setParameter("idcategoria", idCategoria);

        return (List<Objeto>) qr.list();
    }
}